Шаг 24 - VariantCopylnd.

Освобождает принимающий вариант и копирует исходный, выполняя необходимые обращения по указателям, если для исходного варианта задан флаг VT_BYREF.

HRESULT VariantCopyInd
( 
VARIANTARG FAR* pvargDest, 
VARIANTARG FAR* pvargSrc
);

Параметры
pvargDest
Указатель на VARIANTARG, принимающий копию.
pvargSrc
Указатель на копируемый VARIANTARG.

Коды возврата
Из возвращенного HRESULT получают один из следующих кодов возврата:
Код возврата Значение
S_OK Успех.
DISP_E_ARRAYISLOCKED Вариант содержит заблокированный массив.
DISP_E_BADVARTYPE Исходный или принимающий вариант имеют недопустимый тип (обычно не инициализированы).
E_OUTOFMEMORY Невозможно выделить память для размещения копии.
E_NVALIDARG Аргумент pvargSrc — VT_ARRAY.

Комментарии
Эта функция полезна тогда, когда требуется копия варианта и необходимо гарантировать, что она не будет использовать VT_BYREF, например, при работе с аргументами в реализации IDispatch::Invoke.
Например, если исходный тип — это (VT_BYREF | VT_I2), то принимающий вариант будет иметь тип просто VT_I2. Это верно для любых допустимых комбинаций с VT_BYREF, в том числе VT_VARIANT.
Если pvargSrc имеет тип (VT_BYREF | VT_VARIANT) и содержащийся в нем вариант тоже использует VT_BYREF, то и вложенный вариант разыменовывается (dereferenced).
Функция освобождает предыдущее содержимое pvargDest.

Hosted by uCoz